const app = getApp();
const api = require('../../utils/api.js');
const nameMessages = require('../../utils/nameGenerationMessages.js');

Page({
  data: {
    selectedZodiac: '',
    zodiacAnalysis: null,
    formData: null,
    isGenerating: false,
    messageTimers: {
      firstTimer: null,
      interval: null
    },
    adCompleted: false, // 广告是否正常播放完毕
    apiCompleted: false, // API是否已经返回数据
    apiResult: null, // API返回的结果
    zodiacData: {
      '鼠': {
        description: '生肖鼠的人通常聪明机灵，善于适应环境，具有敏锐的观察力和应变能力。性格灵活多变，善于交际，但有时也显得急躁不安。',
        suitable_chars: [
          { feature: '智慧类', description: '推荐使用表示聪明智慧的字' },
          { feature: '灵动类', description: '推荐使用表示机灵敏捷的字' },
          { feature: '水字旁', description: '推荐带"氵"偏旁的字，寓意灵活多变' },
          { feature: '巧妙类', description: '推荐使用表示聪明灵巧的字' },
          { feature: '心字底', description: '推荐带"心"部首的字，寓意心思细腻' }
        ],
        taboo_chars: '猫、狸、豹、虎等与猫科动物相关的字，以及与"克"、"宰"等意义的字'
      },
      '牛': {
        description: '生肖牛的人通常勤劳踏实，性格稳重，有耐心和毅力，做事认真负责，坚持不懈。忠诚可靠，但有时显得固执倔强。',
        suitable_chars: [
          { feature: '稳重类', description: '推荐使用表示稳重踏实的字' },
          { feature: '勤劳类', description: '推荐使用表示勤劳努力的字' },
          { feature: '田字旁', description: '推荐带"田"偏旁的字，寓意脚踏实地' },
          { feature: '坚定类', description: '推荐使用表示坚定不移的字' },
          { feature: '诚信类', description: '推荐使用表示诚实守信的字' }
        ],
        taboo_chars: '虎、豹等与猛兽相关的字，以及与"屠"、"宰"等意义的字'
      },
      '虎': {
        description: '生肖虎的人通常勇敢威猛，气势磅礴，有领导才能，敢作敢为，性格刚毅果断，但有时过于急躁冲动。',
        suitable_chars: [
          { feature: '威武类', description: '推荐使用表示威风凛凛的字' },
          { feature: '勇猛类', description: '推荐使用表示勇猛无畏的字' },
          { feature: '力字旁', description: '推荐带"力"部首的字，寓意强大有力' },
          { feature: '雄壮类', description: '推荐使用表示雄姿英发的字' },
          { feature: '山字旁', description: '推荐带"山"偏旁的字，寓意气势如山' }
        ],
        taboo_chars: '猪、羊等与虎相克的动物相关的字，以及与"困"、"伏"等意义的字'
      },
      '兔': {
        description: '生肖兔的人通常温柔善良，性格温和，举止文雅，谦虚有礼，心思细腻，但有时显得优柔寡断，缺乏坚定的立场。',
        suitable_chars: [
          { feature: '温和类', description: '推荐使用表示温和有礼的字' },
          { feature: '柔美类', description: '推荐使用表示柔和温顺的字' },
          { feature: '艹字头', description: '推荐带"艹"部首的字，寓意生机盎然' },
          { feature: '优雅类', description: '推荐使用表示文雅高贵的字' },
          { feature: '月字旁', description: '推荐带"月"偏旁的字，寓意温柔如月' }
        ],
        taboo_chars: '鹰、狼、鹫等捕食兔子的动物相关的字，以及与"猎"、"捕"等意义的字'
      },
      '龙': {
        description: '生肖龙的人通常充满活力，思想开阔，气度不凡，有理想抱负，自信心强，追求完美，但有时显得过于自信和好高骛远。',
        suitable_chars: [
          { feature: '腾飞类', description: '推荐使用表示腾飞云霄的字' },
          { feature: '飞翔类', description: '推荐使用表示飞黄腾达的字' },
          { feature: '云字旁', description: '推荐带"云"偏旁的字，寓意腾云驾雾' },
          { feature: '祥瑞类', description: '推荐使用表示祥瑞之兆的字' },
          { feature: '高远类', description: '推荐使用表示志向高远的字' }
        ],
        taboo_chars: '凤、凰等与龙相克的字，以及与"伏"、"降"等意义的字'
      },
      '蛇': {
        description: '生肖蛇的人通常头脑灵活，思维敏捷，有智慧，性格沉稳内敛，观察力强，做事深思熟虑，但有时显得过于神秘和心机深沉。',
        suitable_chars: [
          { feature: '灵巧类', description: '推荐使用表示聪明伶俐的字' },
          { feature: '智慧类', description: '推荐使用表示智慧超群的字' },
          { feature: '氵水旁', description: '推荐带"氵"偏旁的字，寓意灵活多变' },
          { feature: '玄妙类', description: '推荐使用表示深邃玄妙的字' },
          { feature: '思考类', description: '推荐使用表示思维敏捷的字' }
        ],
        taboo_chars: '鹰、猫、鹤等捕食蛇的动物相关的字，以及与"斩"、"断"等意义的字'
      },
      '马': {
        description: '生肖马的人通常性格开朗，活泼好动，热情奔放，追求自由，精力充沛，做事雷厉风行，但有时显得急躁冲动，缺乏耐心。',
        suitable_chars: [
          { feature: '奔腾类', description: '推荐使用表示奔腾不息的字' },
          { feature: '驰骋类', description: '推荐使用表示驰骋天下的字' },
          { feature: '足字旁', description: '推荐带"足"偏旁的字，寓意行动迅速' },
          { feature: '跃动类', description: '推荐使用表示跃马扬鞭的字' },
          { feature: '风字旁', description: '推荐带"风"部首的字，寓意如风快速' }
        ],
        taboo_chars: '鼠、虎等与马相克的动物相关的字，以及与"伏"、"困"等意义的字'
      },
      '羊': {
        description: '生肖羊的人通常温和善良，性格平和，富有同情心，善解人意，举止优雅，但有时显得优柔寡断，缺乏主见。',
        suitable_chars: [
          { feature: '善良类', description: '推荐使用表示善良温和的字' },
          { feature: '美好类', description: '推荐使用表示温柔美好的字' },
          { feature: '示字旁', description: '推荐带"示"偏旁的字，寓意和顺祥和' },
          { feature: '优雅类', description: '推荐使用表示文雅高贵的字' },
          { feature: '木字旁', description: '推荐带"木"部首的字，寓意温和如木' }
        ],
        taboo_chars: '虎、狼等捕食羊的动物相关的字，以及与"宰"、"屠"等意义的字'
      },
      '猴': {
        description: '生肖猴的人通常聪明机灵，思维敏捷，反应快，创造力强，好奇心旺盛，活泼好动，但有时显得心浮气躁，缺乏耐心和专注力。',
        suitable_chars: [
          { feature: '灵巧类', description: '推荐使用表示灵巧聪明的字' },
          { feature: '机智类', description: '推荐使用表示机智灵巧的字' },
          { feature: '目字旁', description: '推荐带"目"偏旁的字，寓意观察敏锐' },
          { feature: '敏捷类', description: '推荐使用表示敏捷灵活的字' },
          { feature: '巧思类', description: '推荐使用表示聪慧过人的字' }
        ],
        taboo_chars: '虎、蛇等与猴相克的动物相关的字，以及与"困"、"套"等意义的字'
      },
      '鸡': {
        description: '生肖鸡的人通常勤劳善良，做事认真，注重细节，自信勇敢，行动力强，但有时显得过于自信和好表现。',
        suitable_chars: [
          { feature: '晨曦类', description: '推荐使用表示晨曦初露的字' },
          { feature: '鸣声类', description: '推荐使用表示鸣鸿于天的字' },
          { feature: '日字旁', description: '推荐带"日"偏旁的字，寓意光明朝气' },
          { feature: '勤劳类', description: '推荐使用表示勤奋努力的字' },
          { feature: '声音类', description: '推荐使用表示声名远播的字' }
        ],
        taboo_chars: '狐、犬等与鸡相克的动物相关的字，以及与"捕"、"猎"等意义的字'
      },
      '狗': {
        description: '生肖狗的人通常忠诚可靠，正直诚实，重情义，有责任感，维护正义，但有时显得过于固执和偏执。',
        suitable_chars: [
          { feature: '忠诚类', description: '推荐使用表示忠诚可靠的字' },
          { feature: '诚实类', description: '推荐使用表示诚实守信的字' },
          { feature: '言字旁', description: '推荐带"言"偏旁的字，寓意言出必行' },
          { feature: '守护类', description: '推荐使用表示守护忠诚的字' },
          { feature: '信任类', description: '推荐使用表示信守承诺的字' }
        ],
        taboo_chars: '龙、蛇等与狗相克的动物相关的字，以及与"困"、"束"等意义的字'
      },
      '猪': {
        description: '生肖猪的人通常心地善良，性格温和，为人诚实，重情重义，乐于助人，但有时显得过于天真单纯，缺乏戒心。',
        suitable_chars: [
          { feature: '福泽类', description: '推荐使用表示福泽绵长的字' },
          { feature: '安宁类', description: '推荐使用表示平安喜乐的字' },
          { feature: '心字旁', description: '推荐带"心"偏旁的字，寓意善良淳朴' },
          { feature: '富足类', description: '推荐使用表示富足安康的字' },
          { feature: '家庭类', description: '推荐使用表示家庭和睦的字' }
        ],
        taboo_chars: '蛇、鹰等与猪相克的动物相关的字，以及与"宰"、"屠"等意义的字'
      }
    }
  },

  onLoad(options) {
    // 获取从首页传递的表单数据
    try {
      const eventChannel = this.getOpenerEventChannel();
      if (eventChannel) {
        eventChannel.on('formData', (data) => {
          console.log('生肖取名页面接收到的表单数据:', data);
          console.log('生肖取名页面接收到的姓氏:', data.surname);
          this.setData({
            formData: data
          });
        });
      } else {
        console.log('生肖取名页面: eventChannel不可用，使用默认formData');
        // 设置默认的formData或从options中提取
        this.setData({
          formData: options || {}
        });
      }
    } catch (error) {
      console.error('生肖取名页面onLoad错误:', error);
      this.setData({
        formData: options || {}
      });
    }

    // 创建激励广告实例
    this.createRewardedVideoAd();
  },

  // 创建激励广告实例
  createRewardedVideoAd() {
    // 创建广告实例
    if (wx.createRewardedVideoAd) {
      this.rewardedVideoAd = wx.createRewardedVideoAd({
        adUnitId: 'adunit-175c969dc9d47062'
      });

      // 监听广告加载事件
      this.rewardedVideoAd.onLoad(() => {
        console.log('激励广告加载成功');
      });

      // 监听广告错误事件
      this.rewardedVideoAd.onError((err) => {
        console.error('激励广告出错:', err);
        // 广告拉取异常视为播放完毕
        this.setData({
          adCompleted: true
        });
        
        // 如果API已完成，立即停止提示消息
        if (this.data.apiCompleted) {
          this.showMessages(false);
        }
        
        // 检查是否可以导航到结果页
        this.checkNavigationConditions();
      });

      // 监听广告关闭事件
      this.rewardedVideoAd.onClose((res) => {
        console.log('激励广告关闭', res);

        // 判断是否是正常关闭(用户看完了广告)
        if (res && res.isEnded) {
          console.log('激励广告完整观看');
          this.setData({
            adCompleted: true
          });
          
          // 如果API已完成，立即停止提示消息
          if (this.data.apiCompleted) {
            this.showMessages(false);
          }
          
          // 检查是否可以导航到结果页
          this.checkNavigationConditions();
        } else {
          // 不是正常结束时先停止消息循环
          this.showMessages(false);
          
          console.log('激励广告提前关闭');
          // 提示用户广告未播放完毕
          wx.showModal({
            title: '提示',
            content: '广告未播放完毕，无法生成名字，是否继续播放？',
            success: (res) => {
              if (res.confirm) {
                // 用户点击确定，继续播放广告
                this.showMessages(true); // 重新打开提示消息
                this.showRewardedVideoAd(); // 重新播放广告
              } else {
                // 用户点击取消，中断名字生成流程
                this.cancelNameGeneration();
              }
            }
          });
        }
      });
    }
  },

  // 显示激励广告
  showRewardedVideoAd() {
    if (this.rewardedVideoAd) {
      this.rewardedVideoAd.show()
        .catch(err => {
          // 失败重试
          this.rewardedVideoAd.load()
            .then(() => this.rewardedVideoAd.show())
            .catch(err => {
              console.error('激励广告显示失败:', err);
              // 广告显示异常视为播放完毕
              this.setData({
                adCompleted: true
              });
              
              // 如果API已完成，立即停止提示消息
              if (this.data.apiCompleted) {
                this.showMessages(false);
              }
              
              // 检查是否可以导航到结果页
              this.checkNavigationConditions();
            });
        });
    }
  },

  // 取消名字生成
  cancelNameGeneration() {
    // 重置状态
    this.setData({
      isGenerating: false,
      adCompleted: false,
      apiCompleted: false,
      apiResult: null
    });
    
    // 关闭所有提示
    this.showMessages(false);
    
    try {
      wx.hideToast();
    } catch (e) {
      console.error('hideToast error:', e);
    }
    
    try {
      wx.hideLoading();
    } catch (e) {
      console.error('hideLoading error:', e);
    }
  },

  // 检查是否满足导航条件
  checkNavigationConditions() {
    if (this.data.adCompleted && this.data.apiCompleted && this.data.apiResult) {
      // 确保消息循环已关闭
      this.showMessages(false);
      // 导航到结果页
      this.navigateToResultPage(this.data.apiResult);
    }
  },

  // 选择生肖
  selectZodiac(e) {
    const zodiac = e.currentTarget.dataset.zodiac;
    this.setData({
      selectedZodiac: zodiac,
      zodiacAnalysis: this.data.zodiacData[zodiac]
    });
  },

  // 生成名字
  generateNames() {
    if (!this.checkFormValid()) {
      return;
    }

    // 提示用户将播放广告
    wx.showModal({
      title: '提示',
      content: '计算名字大概需要30秒，为了分担服务成本，会播放一段广告，请耐心等待...',
      success: (res) => {
        if (res.confirm) {
          // 用户同意观看广告，开始生成名字流程
          this.startNameGeneration();
        } else {
          // 用户拒绝观看广告，中断流程
          console.log('用户拒绝观看广告');
        }
      }
    });
  },

  // 开始名字生成流程
  startNameGeneration() {
    // 重置状态
    this.setData({
      isGenerating: true,
      adCompleted: false,
      apiCompleted: false,
      apiResult: null
    });

    // 显示初始加载动画 - 确保mask为false允许点击
    wx.showLoading({
      title: '正在推荐名字\n请耐心等待...',
      mask: false
    });
    
    // 启动提示消息循环显示
    this.showMessages(true);
    
    // 准备请求数据并异步调用API
    this.callNameGenerationAPI()
      .then(result => {
        // 保存API结果
        this.setData({
          apiCompleted: true,
          apiResult: result
        });
        
        // 如果广告已完成，立即停止提示消息
        if (this.data.adCompleted) {
          this.showMessages(false);
        }
        
        // 检查是否可以导航到结果页
        this.checkNavigationConditions();
      })
      .catch(error => {
        console.error('生成名字失败:', error);
        this.setData({
          isGenerating: false,
          apiCompleted: true
        });
        
        // 无论成功失败都应该停止提示消息
        this.showMessages(false);
      });
 
    // 开始播放激励广告
    this.showRewardedVideoAd();
  },

  // 循环显示提示消息的方法
  showMessages(isShow) {
    // 清除可能存在的旧定时器
    if (this.data.messageTimers.firstTimer) {
      clearTimeout(this.data.messageTimers.firstTimer);
    }
    
    if (this.data.messageTimers.interval) {
      clearInterval(this.data.messageTimers.interval);
    }
    
    if (!isShow) {
      // 如果不需要显示消息，直接返回
      return;
    }
    
    // 使用生肖文化取名法的特定提示消息
    const nameGenerationMessages = nameMessages.zodiacGenerationMessages;
    let nameMessageIndex = 0;
    
    const showNameGenerationMessage = () => {
      // 先隐藏之前的提示
      try {
        wx.hideToast();
      } catch (e) {
        console.error('hideToast error:', e);
      }
      
      try {
        wx.hideLoading();
      } catch (e) {
        console.error('hideLoading error:', e);
      }
      
      // 显示新的提示 - 设置mask为false，让用户可以点击其他元素
      wx.showToast({
        title: nameGenerationMessages[nameMessageIndex],
        icon: 'none',
        duration: 10000,
        mask: false
      });
      
      // 更新消息索引，循环使用提示
      nameMessageIndex = (nameMessageIndex + 1) % nameGenerationMessages.length;
    };
    
    // 3秒后显示第一次提示
    const firstNameTimer = setTimeout(() => {
      if (this.data.isGenerating) {
        showNameGenerationMessage();
      }
    }, 3000);
    
    // 每4秒更新一次提示，直到请求完成
    const nameGenerationInterval = setInterval(() => {
      if (this.data.isGenerating) {
        showNameGenerationMessage();
      } else {
        clearInterval(nameGenerationInterval);
      }
    }, 4000);
    
    // 保存定时器引用
    this.setData({
      messageTimers: {
        firstTimer: firstNameTimer,
        interval: nameGenerationInterval
      }
    });
  },

  // 调用API生成名字
  callNameGenerationAPI() {
    // 返回Promise以支持异步流程控制
    return new Promise((resolve, reject) => {
      // 获取姓氏和性别等数据
      const formData = this.data.formData || {};
      const surname = formData.surname;
      const gender = formData.gender;
      const nameLength = formData.nameLength;
      const selectedZodiac = this.data.selectedZodiac;
      
      console.log('生肖文化取名页面准备发送的数据:', {
        surname: surname,
        gender: gender,
        nameLength: nameLength,
        selectedZodiac: selectedZodiac
      });

      // 异步调用API生成名字
      api.generateRealName({
        wuxing: "", // 生肖文化取名法不需要属性参数
        optimize_expect: "", // 生肖文化取名法不需要期望描述
        surname: surname, // 姓氏
        gender: gender === 'male' ? '男' : '女', // 性别
        nameLength: nameLength, // 名字长度
        preference: "zodiac", // 取名偏好为生肖文化取名法
        // 修正参数名称，并将布尔值转换为y/n字符串
        is_rare_character: formData.disableRareChars ? "y" : "n", 
        is_complex_character: formData.disableComplexChars ? "y" : "n",
        zodiac: selectedZodiac, // 选中的生肖
        // 添加定字取名相关参数
        is_fixedname: formData.fixedChar || false,
        fixedposition: formData.fixedPosition || 'first',
        fixed_word: formData.fixedCharValue || '',
        namesNum: formData.namesNum || 10, // 添加名字生成数量参数
      })
      .then(result => {
        // 不再关闭消息循环显示
        console.log('API返回的名字数据:', result);
        
        // 保存生成的名字数据
        this.saveNamesData(result);
        
        // 返回结果数据，完成Promise
        resolve(result);
      })
      .catch(error => {
        console.error('生成名字API调用失败:', error);
        wx.showToast({
          title: '生成名字失败，请重试',
          icon: 'none'
        });
        
        // 拒绝Promise
        reject(error);
      })
      .finally(() => {
        // 只隐藏loading，不影响消息循环
        try {
          wx.hideLoading();
        } catch (e) {
          console.error('hideLoading error:', e);
        }
      });
    });
  },

  // 保存名字数据到全局和本地存储
  saveNamesData(result) {
    const formData = this.data.formData;
    const surname = formData.surname;
    const gender = formData.gender;
    const nameLength = formData.nameLength;
    const selectedZodiac = this.data.selectedZodiac;
    
    // 构建要保存的数据对象
    const namesResultData = {
      surname: surname,
      gender: gender,
      nameLength: nameLength,
      selectedZodiac: selectedZodiac,
      namesData: result,
      methodType: 'zodiac',
      // 传递定字取名参数
      is_fixedname: formData ? formData.fixedChar : false,
      fixedposition: formData ? formData.fixedPosition : 'first',
      fixed_word: formData ? formData.fixedCharValue : '',
      disableRareChars: this.data.formData.disableRareChars,
          disableComplexChars: this.data.formData.disableComplexChars
      
    };
    
    // 将API结果保存到全局变量，确保数据不会丢失
    const app = getApp();
    app.globalData = app.globalData || {};
    app.globalData.namesResult = namesResultData;
    
    // 同时也保存到本地存储作为备份
    wx.setStorageSync('namesResultData', namesResultData);
  },

  // 导航到结果页面
  navigateToResultPage(result) {
    // 确保重置生成状态
    this.setData({
      isGenerating: false
    });
    
    const formData = this.data.formData;
    const surname = formData.surname;
    const gender = formData.gender;
    const nameLength = formData.nameLength;
    const selectedZodiac = this.data.selectedZodiac;
    
    // 构建需要传递给结果页的数据
    const resultPageData = {
      surname: surname,
      gender: gender,
      nameLength: nameLength,
      selectedZodiac: selectedZodiac,
      namesData: result,
      methodType: 'zodiac', // 指明是生肖文化取名法
      // 传递定字取名参数
      is_fixedname: formData ? formData.fixedChar : false,
      fixedposition: formData ? formData.fixedPosition : 'first',
      fixed_word: formData ? formData.fixedCharValue : '',
      disableRareChars: this.data.formData.disableRareChars,
      disableComplexChars: this.data.formData.disableComplexChars
    };
    
    // 确保所有提示已关闭
    try {
      wx.hideToast();
    } catch (e) {
      console.error('hideToast error:', e);
    }
    
    try {
      wx.hideLoading();
    } catch (e) {
      console.error('hideLoading error:', e);
    }
    
    wx.navigateTo({
      url: '/pages/results/results?methodType=zodiac&source=zodiac&hasData=true',
      success: (res) => {
        console.log('生肖文化取名页面传递给结果页的数据:', {
          surname: surname,
          gender: gender,
          nameLength: nameLength,
          selectedZodiac: selectedZodiac,
          methodType: 'zodiac'
        });
        
        // 通过eventChannel传递数据作为备份方式
        res.eventChannel.emit('resultData', resultPageData);
      },
      fail: (err) => {
        console.error('导航到结果页面失败:', err);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },

  checkFormValid() {
    if (!this.data.selectedZodiac) {
      wx.showToast({
        title: '请先选择生肖',
        icon: 'none'
      });
      return false;
    }
    return true;
  },

  // 页面卸载时清理资源
  onUnload() {
    // 清理消息定时器
    this.showMessages(false);
    
    // 清理广告相关资源
    if (this.rewardedVideoAd) {
      try {
        // 尝试销毁广告实例，不是所有小程序版本都支持此方法
        if (typeof this.rewardedVideoAd.destroy === 'function') {
          this.rewardedVideoAd.destroy();
        }
      } catch (e) {
        console.error('销毁广告实例失败:', e);
      }
    }
  },
}); 